<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Moodle guest book block..
*
* @package block_moodlebook
* @copyright Konovalov Nikolay <konovalov.nk@gmail.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

/**
 * Вспомогательный класс для работы с базой данных MySQL через интерфейс Moodle API
 * 
 * @author nk11k
 */

class moodle_db {

    private $msgtable;
    private $cmttable;

    function __construct() {
        global $CFG;
        if (empty($CFG->msgtable)) {
            $this->msgtable = 'block_moodlebook_messages';
        } else {
            $this->msgtable = $CFG->msgtable;
        }
        if (empty($CFG->cmttable)) {
            $this->cmttable = 'block_moodlebook_comments';
        } else {
            $this->cmttable = $CFG->cmttable;
        }
    }
    /**
     * Метод для добавления сообщения в ленту
     *
     * @access public
     * @param string $text текст сообщения
     * @param string $author имя автора сообщения
     * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
     */
    public function add_message($text, $author) {
        if (!is_string($text) || !is_string($author)) {
            return FALSE;
        }
            global $DB;
            $record = new stdClass();
            $record->text     = $text;
            $record->author   = $author;
            $record->datetime = time();
            $record->modified = time();
        try {
            return $DB->insert_record($this->msgtable, $record, false);        
        } catch (invalid_parameter_exception $e) {
            var_dump($e->getMessage());
        }
    }

    /**
     * Метод для добавления комментария в ленту
     *
     * @access public
     * @param Integer $messageid номер сообщения ленты, для которого следует добавить комментарий
     * @param string $text текст сообщения
     * @param string $author имя автора сообщения
     * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
     */
    public function add_commentary($messageid, $text, $author) {
        if (!is_numeric($messageid) || 
            !is_string($text)       || 
            !is_string($author)) {
            return FALSE;
        }
        global $DB;
        $record = new stdClass();
        $record->messageid = $messageid;
        $record->text      = $text;
        $record->author    = $author;
        $record->datetime  = time();
        try {
            return $DB->insert_record($this->cmttable, $record, false);        
        } catch (invalid_parameter_exception $e) {
            var_dump($e->getMessage());
        }
    }

    /**
     * Метод для обновления сообщения в ленте
     *
     * @access public
     * @param Integer $messageid номер сообщения ленты, который следует изменить
     * @param string $text текст сообщения
     * @param string $author имя автора сообщения
     * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
     */
    public function update_message($messageid, $text, $author) {
        if (!is_numeric($messageid) || 
            !is_string($text)       || 
            !is_string($author)) {
            return FALSE;
        }
        global $DB;
        $record = new stdClass();
        $record->id        = $messageid;
        $record->text      = $text;
        $record->author    = $author;
        $record->modified  = time();
        try {
            return $DB->update_record($this->msgtable, $record);        
        } catch (invalid_parameter_exception $e) {
            var_dump($e->getMessage());
        }
    }

    /**
     * Метод для обновления комментария в ленте
     *
     * @access public
     * @param Integer $messageid номер сообщения ленты, который содержит комментарий
     * @param Integer $cmtid номер комментария, который следует изменить
     * @param string $text текст сообщения
     * @param string $author имя автора сообщения
     * @return Boolean TRUE в случае успешного завершения метода, иначе - FALSE
     */
    public function update_commentary($messageid, $cmtid, $text, $author) {
        if (!is_numeric($messageid) || 
            !is_numeric($cmtid)     || 
            !is_string($text)       || 
            !is_string($author)) {
            return FALSE;
        }
        global $DB;
        $record = new stdClass();
        $record->id        = $cmtid;
        $record->messageid = $messageid;
        $record->text      = $text;
        $record->author    = $author;
        try {
            return $DB->update_record($this->cmttable, $record);
        } catch (invalid_parameter_exception $e) {
            var_dump($e->getMessage());
        }
    }

    /**
     * Метод для удаления сообщения из ленты
     * 
     * Выполняет SQL-запрос на удаления сообщения по его $messageid
     * 
     * @access public
     * @param integer $messageid номер сообщения
     * @return boolean в случае ошибки возвращает false и наоборот
     */
    public function delete_message($messageid) {
        if (!is_numeric($messageid)) {
            return FALSE;
        }
        global $DB;
        $conditions  = array('id' => $messageid);
        try {
            $DB->delete_records($this->cmttable, $conditions); // сначала комментарии
            return $DB->delete_records($this->msgtable, $conditions);
        } catch (invalid_parameter_exception $e) {
            var_dump($e->getMessage());
        }
    }
    
    /**
     * Метод для удаления комментария из ленты
     * 
     * Выполняет SQL-запрос на удаления комментария по его $messageid и $commentaryid
     * 
     * @access public
     * @param integer $messageid номер сообщения
     * @param integer $commentaryid номер комментария
     * @return boolean в случае ошибки возвращает false и наоборот
     */
    public function delete_commentary($messageid, $commentaryid) {
        if (!is_numeric($messageid) || !is_numeric($commentaryid)) {
            return FALSE;
        }
        global $DB;
        $conditions  = array('id' => $commentaryid, 'messageid' => $messageid);
        try {
            return $DB->delete_records($this->cmttable, $conditions);
        } catch (invalid_parameter_exception $e) {
            var_dump($e->getMessage());
        }
    }
}